package com.wh.wisdomsite.xbox.utils.encrypt.md5;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;



/**
 * MD5加密解密工具
 * @Package com.wh.wisdomsite.xbox.utils.encrypt.md5
 * @author 谢泽鹏
 * @date 2014年10月8日 下午4:02:14
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2014
 * @version V1.0
 */
public class MD5Tool_Two {

    private static final Log logger = LogFactory.getLog(MD5Tool_Two.class);



	/**
	 * MD5加密(16进制,返回大写)
	 * @param sSrc 加密字符串
	 * @return 加密值
	 */
	public static String MD5(String sSrc) {
        //加密值
		String strings = null;
		//用来将字节转换成 16 进制表示的字
		char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };
		try {
            logger.info("MD5->>加密sSrc：" + sSrc);
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(sSrc.getBytes());
			//MD5 的计算结果是 128 位的长整数，
			byte tmp[] = md.digest(); 
			//每个字节16 进制表示的话，使用两个字符，							
			char ch[] = new char[16 * 2]; 
			//表示转换结果中对应的字符位置
			int k = 0; 
			for (int i = 0; i < 16; i++) { 						
				byte byte0 = tmp[i]; 
				ch[k++] = hexDigits[byte0 >>> 4 & 0xf]; 														
				ch[k++] = hexDigits[byte0 & 0xf]; 
			}
			strings = new String(ch).toUpperCase();
            logger.info("MD5->>加密值：" + strings);
		} catch (Exception e) {
			e.printStackTrace();
            logger.error("MD5->>加密Exception：" + e.getMessage());
            strings = null;
		}
			return strings;
	}
	
	
	
	/**
	 * MD5加密(返回小写)
	 * @param sSrc 加密字符串
	 * @return String   
	 */
    public static String md5(String sSrc) {
        String strings = null;
        try {
            logger.info("md5->>加密sSrc：" + sSrc);
        	byte[] hash;
            hash = MessageDigest.getInstance("MD5").digest(sSrc.getBytes("UTF-8"));
            StringBuilder hex = new StringBuilder(hash.length * 2);
            for (byte b : hash) {
                if ((b & 0xFF) < 0x10)
                    hex.append("0");
                hex.append(Integer.toHexString(b & 0xFF));
            }
            strings = hex.toString();
            logger.info("md5->>加密值：" + strings);
        } catch (NoSuchAlgorithmException e) {
        	e.printStackTrace();
            strings = null;
            logger.error("md5->>加密Exception：" + e.getMessage());
        } catch (UnsupportedEncodingException e) {
        	e.printStackTrace();
        	strings = null;
            logger.error("md5->>加密Exception：" + e.getMessage());
        }
        	return strings;
    }

    //测试
	public static void main(String args[]) {
        //MD5Tool_Two.MD5("wisdomsite");
        MD5Tool_Two.MD5("zsd2238700");
	}
}
